home *** CD-ROM | disk | FTP | other *** search
/ Personal Computer World 2009 February / PCWFEB09.iso / Software / Resources / Chat & Communication / Digsby build 37 / digsby_setup.exe / lib / simplejson / decoder.pyo (.txt) < prev    next >
Python Compiled Bytecode  |  2008-10-13  |  9KB  |  344 lines

  1. # Source Generated with Decompyle++
  2. # File: in.pyo (Python 2.5)
  3.  
  4. import re
  5. import sys
  6. from simplejson.scanner import make_scanner, pattern
  7.  
  8. try:
  9.     from simplejson._speedups import scanstring as c_scanstring
  10. except ImportError:
  11.     c_scanstring = None
  12.  
  13. FLAGS = re.VERBOSE | re.MULTILINE | re.DOTALL
  14.  
  15. def _floatconstants():
  16.     import struct as struct
  17.     import sys as sys
  18.     _BYTES = '7FF80000000000007FF0000000000000'.decode('hex')
  19.     if sys.byteorder != 'big':
  20.         _BYTES = _BYTES[:8][::-1] + _BYTES[8:][::-1]
  21.     
  22.     (nan, inf) = struct.unpack('dd', _BYTES)
  23.     return (nan, inf, -inf)
  24.  
  25. (NaN, PosInf, NegInf) = _floatconstants()
  26.  
  27. def linecol(doc, pos):
  28.     lineno = doc.count('\n', 0, pos) + 1
  29.     if lineno == 1:
  30.         colno = pos
  31.     else:
  32.         colno = pos - doc.rindex('\n', 0, pos)
  33.     return (lineno, colno)
  34.  
  35.  
  36. def errmsg(msg, doc, pos, end = None):
  37.     (lineno, colno) = linecol(doc, pos)
  38.     if end is None:
  39.         return '%s: line %d column %d (char %d)' % (msg, lineno, colno, pos)
  40.     
  41.     (endlineno, endcolno) = linecol(doc, end)
  42.     return '%s: line %d column %d - line %d column %d (char %d - %d)' % (msg, lineno, colno, endlineno, endcolno, pos, end)
  43.  
  44. _CONSTANTS = {
  45.     '-Infinity': NegInf,
  46.     'Infinity': PosInf,
  47.     'NaN': NaN,
  48.     'true': True,
  49.     'false': False,
  50.     'null': None }
  51.  
  52. def JSONConstant(match, context, c = _CONSTANTS):
  53.     s = match.group(0)
  54.     fn = getattr(context, 'parse_constant', None)
  55.     if fn is None:
  56.         rval = c[s]
  57.     else:
  58.         rval = fn(s)
  59.     return (rval, match.end())
  60.  
  61. pattern('(-?Infinity|NaN|true|false|null)')(JSONConstant)
  62.  
  63. def JSONNumber(match, context):
  64.     (integer, frac, exp) = match.groups()[:3]
  65.     fn = None if frac or exp else int
  66.     res = fn(integer)
  67.     return (res, match.end())
  68.  
  69. pattern('(-?(?:0|[1-9]\\d*))(\\.\\d+)?([eE][-+]?\\d+)?')(JSONNumber)
  70. STRINGCHUNK = re.compile('(.*?)(["\\\\\\x00-\\x1f])', FLAGS)
  71. BACKSLASH = {
  72.     '"': u'"',
  73.     '\\': u'\\',
  74.     '/': u'/',
  75.     'b': u'\x08',
  76.     'f': u'\x0c',
  77.     'n': u'\n',
  78.     'r': u'\r',
  79.     't': u'\t' }
  80. DEFAULT_ENCODING = 'utf-8'
  81.  
  82. def py_scanstring(s, end, encoding = None, strict = True, _b = BACKSLASH, _m = STRINGCHUNK.match):
  83.     if encoding is None:
  84.         encoding = DEFAULT_ENCODING
  85.     
  86.     chunks = []
  87.     _append = chunks.append
  88.     begin = end - 1
  89.     while None:
  90.         chunk = _m(s, end)
  91.         if chunk is None:
  92.             raise ValueError(errmsg('Unterminated string starting at', s, begin))
  93.         
  94.         end = chunk.end()
  95.         (content, terminator) = chunk.groups()
  96.         if content:
  97.             if not isinstance(content, unicode):
  98.                 content = unicode(content, encoding)
  99.             
  100.             _append(content)
  101.         
  102.         if terminator == '"':
  103.             break
  104.         elif terminator != '\\':
  105.             if strict:
  106.                 raise ValueError(errmsg('Invalid control character %r at', s, end))
  107.             else:
  108.                 _append(terminator)
  109.         
  110.         
  111.         try:
  112.             esc = s[end]
  113.         except IndexError:
  114.             raise ValueError(errmsg('Unterminated string starting at', s, begin))
  115.  
  116.         if esc != 'u':
  117.             
  118.             try:
  119.                 m = _b[esc]
  120.             except KeyError:
  121.                 raise ValueError(errmsg('Invalid \\escape: %r' % (esc,), s, end))
  122.  
  123.             end += 1
  124.         else:
  125.             esc = s[end + 1:end + 5]
  126.             next_end = end + 5
  127.             msg = 'Invalid \\uXXXX escape'
  128.             
  129.             try:
  130.                 if len(esc) != 4:
  131.                     raise ValueError
  132.                 
  133.                 uni = int(esc, 16)
  134.                 if uni <= uni:
  135.                     pass
  136.                 elif uni <= 56319 and sys.maxunicode > 65535:
  137.                     msg = 'Invalid \\uXXXX\\uXXXX surrogate pair'
  138.                     if not s[end + 5:end + 7] == '\\u':
  139.                         raise ValueError
  140.                     
  141.                     esc2 = s[end + 7:end + 11]
  142.                     if len(esc2) != 4:
  143.                         raise ValueError
  144.                     
  145.                     uni2 = int(esc2, 16)
  146.                     uni = 65536 + (uni - 55296 << 10 | uni2 - 56320)
  147.                     next_end += 6
  148.                 
  149.                 m = unichr(uni)
  150.             except ValueError:
  151.                 raise ValueError(errmsg(msg, s, end))
  152.  
  153.             end = next_end
  154.         continue
  155.         return (u''.join(chunks), end)
  156.  
  157. if not c_scanstring:
  158.     pass
  159. scanstring = py_scanstring
  160.  
  161. def JSONString(.0, context):
  162.     (string, end) = .0
  163.     encoding = getattr(context, 'encoding', None)
  164.     strict = getattr(context, 'strict', True)
  165.     return scanstring(string, end, encoding, strict)
  166.  
  167. pattern('"')(JSONString)
  168. WHITESPACE = re.compile('[ \\t\\n\\r]*', FLAGS)
  169. WHITESPACE_STR = ' \t\n\r'
  170.  
  171. def JSONObject(.0, context, _w = WHITESPACE.match, _ws = WHITESPACE_STR):
  172.     (s, end) = .0
  173.     pairs = { }
  174.     nextchar = s[end:end + 1]
  175.     if nextchar != '"':
  176.         if nextchar in _ws:
  177.             end = _w(s, end).end()
  178.             nextchar = s[end:end + 1]
  179.         
  180.         if nextchar == '}':
  181.             return (pairs, end + 1)
  182.         elif nextchar != '"':
  183.             raise ValueError(errmsg('Expecting property name', s, end))
  184.         
  185.     
  186.     end += 1
  187.     encoding = getattr(context, 'encoding', None)
  188.     strict = getattr(context, 'strict', True)
  189.     scan_once = JSONScanner
  190.     while True:
  191.         (key, end) = scanstring(s, end, encoding, strict)
  192.         if s[end:end + 1] != ':':
  193.             end = _w(s, end).end()
  194.             if s[end:end + 1] != ':':
  195.                 raise ValueError(errmsg('Expecting : delimiter', s, end))
  196.             
  197.         
  198.         end += 1
  199.         
  200.         try:
  201.             if s[end] in _ws:
  202.                 end += 1
  203.                 if s[end] in _ws:
  204.                     end = _w(s, end).end()
  205.                 
  206.         except IndexError:
  207.             pass
  208.  
  209.         
  210.         try:
  211.             (value, end) = scan_once(s, end, context)
  212.         except StopIteration:
  213.             raise ValueError(errmsg('Expecting object', s, end))
  214.  
  215.         pairs[key] = value
  216.         nextchar = s[end:end + 1]
  217.         if nextchar in _ws:
  218.             end = _w(s, end).end()
  219.             nextchar = s[end:end + 1]
  220.         
  221.         end += 1
  222.         if nextchar == '}':
  223.             break
  224.         elif nextchar != ',':
  225.             raise ValueError(errmsg('Expecting , delimiter', s, end - 1))
  226.         
  227.         
  228.         try:
  229.             if s[end] in _ws:
  230.                 end += 1
  231.                 if s[end] in _ws:
  232.                     end = _w(s, end).end()
  233.                 
  234.         except IndexError:
  235.             pass
  236.  
  237.         nextchar = s[end:end + 1]
  238.         end += 1
  239.         if nextchar != '"':
  240.             raise ValueError(errmsg('Expecting property name', s, end - 1))
  241.             continue
  242.     object_hook = getattr(context, 'object_hook', None)
  243.     if object_hook is not None:
  244.         pairs = object_hook(pairs)
  245.     
  246.     return (pairs, end)
  247.  
  248. pattern('{')(JSONObject)
  249.  
  250. def JSONArray(.0, context, _w = WHITESPACE.match, _ws = WHITESPACE_STR):
  251.     (s, end) = .0
  252.     values = []
  253.     nextchar = s[end:end + 1]
  254.     if nextchar in _ws:
  255.         end = _w(s, end).end()
  256.         nextchar = s[end:end + 1]
  257.     
  258.     if nextchar == ']':
  259.         return (values, end + 1)
  260.     
  261.     scan_once = JSONScanner
  262.     while True:
  263.         
  264.         try:
  265.             (value, end) = scan_once(s, end, context)
  266.         except StopIteration:
  267.             raise ValueError(errmsg('Expecting object', s, end))
  268.  
  269.         values.append(value)
  270.         nextchar = s[end:end + 1]
  271.         if nextchar in _ws:
  272.             end = _w(s, end).end()
  273.             nextchar = s[end:end + 1]
  274.         
  275.         end += 1
  276.         if nextchar == ']':
  277.             break
  278.         
  279.         if nextchar != ',':
  280.             raise ValueError(errmsg('Expecting , delimiter', s, end))
  281.         
  282.         
  283.         try:
  284.             if s[end] in _ws:
  285.                 end += 1
  286.                 if s[end] in _ws:
  287.                     end = _w(s, end).end()
  288.                 
  289.         continue
  290.         except IndexError:
  291.             continue
  292.         
  293.  
  294.         None<EXCEPTION MATCH>IndexError
  295.     return (values, end)
  296.  
  297. pattern('\\[')(JSONArray)
  298. ANYTHING = [
  299.     JSONObject,
  300.     JSONArray,
  301.     JSONString,
  302.     JSONConstant,
  303.     JSONNumber]
  304. JSONScanner = make_scanner(ANYTHING)
  305.  
  306. class JSONDecoder(object):
  307.     __all__ = [
  308.         '__init__',
  309.         'decode',
  310.         'raw_decode']
  311.     
  312.     def __init__(self, encoding = None, object_hook = None, parse_float = None, parse_int = None, parse_constant = None, strict = True):
  313.         self.encoding = encoding
  314.         self.object_hook = object_hook
  315.         self.parse_float = parse_float
  316.         self.parse_int = parse_int
  317.         self.parse_constant = parse_constant
  318.         self.strict = strict
  319.  
  320.     
  321.     def decode(self, s, _w = WHITESPACE.match):
  322.         (obj, end) = self.raw_decode(s, idx = _w(s, 0).end())
  323.         end = _w(s, end).end()
  324.         if end != len(s):
  325.             raise ValueError(errmsg('Extra data', s, end, len(s)))
  326.         
  327.         return obj
  328.  
  329.     
  330.     def raw_decode(self, s, **kw):
  331.         idx = kw.get('idx', 0)
  332.         context = kw.get('context', self)
  333.         
  334.         try:
  335.             (obj, end) = JSONScanner(s, idx, context)
  336.         except StopIteration:
  337.             raise ValueError('No JSON object could be decoded')
  338.  
  339.         return (obj, end)
  340.  
  341.  
  342. __all__ = [
  343.     'JSONDecoder']
  344.